<?php
/**
 * @category 	BoardController.php
 * @author 		Sung Hoon, Cho (akdddnet@gmail.com)
 * @since		2011. 7. 5.
 * @license		BSD License
 * @version		0.1
 *
 */

global $CFG;
require_once $CFG->FW_DIR."/mvc/Controller.php";
require_once $CFG->CLASSES_DIR."/".$CFG->PATH->ADMIN."/board/BoardAdminEB.php";
require_once $CFG->CLASSES_DIR."/board/BoardEB.php";
require_once $CFG->CLASSES_DIR."/default/FileEB.php";


class BoardController extends Controller {
	/**
	  * 생성자 삭제 하시면 안됩니다 ㅠ
	  */
	function __construct() {
		parent::__construct(get_class());	// 꼭 부모의 construct를 실행 해줘야됩니다.
	} 
	
	
	function start() {
		global $CFG;
		
		$this->tpl->assign(array(
					"action"=>$this->action
					,"module"=>$this->module
		));
	}
	
	
	/**
	 * 게시판 설정 정보 가져오기
	 * @param string $bid
	 */
	private function getBoardInfo($bid) {
		if(!Common::isNullOrEmpty($bid)) {
			
			// 게시판 정보 가져오기
			$beb = new BoardAdminEB();
			$beb->ba_id = $bid;
			
			$dto = new DTO();
			$dto->eb = $beb;
			
			$boardinfo = $this->dao->getBoardInfo($dto)->obj;
			
			if(!Common::isNullOrEmpty($boardinfo)) {
				return $boardinfo;	
			} else {
				Javascript::getAlert("존재하지 않는 게시판 입니다.");
			}
			
			
		} else {
			Javascript::getAlert("bid값이 전달되지 않았습니다.");
		}
	}
	
	
	
	
	function index($bid) {
		return $this->bbs($bid);
	}
	
	function search($bid, $kf, $kw) {
		return $this->bbs($bid, $kf, $kw);
	}
	
	
	function bbs($bid, $kf=null, $kw=null) {
		
		$this->page->class = 'board';
		
		$boardinfo = $this->getBoardInfo($bid);
		
		
		$param = new Parameter();
		$page = $param->getParameter("p", 1);
		$ls = $param->getParameter("ls", $boardinfo->ba_listingnum);
		$ps = $param->getParameter('ps', $boardinfo->ba_pagingnum);
		
		
		$search = new stdClass;
		$search->is = (!Common::isNullOrEmpty($kw) && !Common::isNullOrEmpty($kf)) ? true : false;
		$search->kf = array(Common::setOption('subject', '제목'), Common::setOption('content', '내용'), Common::setOption('all', '제목+내용'));
		$search->url = $this->action.'/bbs/'.$boardinfo->ba_id;
		if($search->is) {
			$search->url .= '/'.$kf.'/'.$kw;
		}
		
		$search->url .= '/'.$param->getGeneratorQueryString();
		$search->ls = $ls; 
		

		$dto = new DTO();
		$eb = new BoardEB();
		$eb->ba_id = $bid;
		$eb->ba_seq = $boardinfo->ba_seq;
		if($search->is) {
			$eb->issearch = $search->is;
			$eb->kf = $kf;
			$eb->kw = $kw;
		}
		$dto->eb = $eb;
		
		// 총 게시물 갯수 가져오기
		$tc = $this->dao->getTotalCount($dto)->rc;
		
		// 페이징 셋팅
		$cf_paging = new CF_util_paging(array('total'=>$tc, 'currentPage'=>$page, 'block'=>5, 'rows'=>$ls, 'pageString'=>'p', 'center'=>true));
		$paging = $cf_paging->getAll();
		
		// 페이징 정보를 가져온걸 다시 eb에 셋팅.
		$eb->tc = $tc;
		$eb->p = $p;
		$eb->ls = $ls;
		$eb->ps = $ps;
		$eb->limit = $paging->limit;
		$eb->offset = $paging->offset;
		$dto->eb = $eb;
		
		// 리스트 정보 가져오기
		$dto = $this->dao->bbs($dto);
		
		$list = $dto->list;
	
		if($list) {
			foreach($list as $board) {  
				$board->date = date("Y-m-d H:i", strtotime($board->b_cdate));
			}
		}
		
		
		$this->tpl->define(array("body"=>"../skin/".$boardinfo->ba_skin."/bbs.html"));
		$this->tpl->assign(array(
			 "list"=>$list
			,"paging"=>$paging
			,"binfo"=>$boardinfo
			,'search'=>$search
		));
	}
 
	
	
	function view($bid, $seq) {
		$boardinfo = $this->getBoardInfo($bid);
		
		$dto = new DTO();
		$eb = new BoardEB();
		
		$eb->ba_seq = $boardinfo->ba_seq;
		$eb->ba_id = $bid;
		$eb->b_seq = $seq;
		$dto->eb = $eb;
		
		$result = $this->dao->view($dto)->obj;
		//Common::print_r($result);
		if(!Common::isNullOrEmpty($result)) {
			$result->date = date("Y-m-d H:i", strtotime($result->b_cdate));
			
			$is_hit = false;
			// 조회수 증가시키기
			if(self::doHitAdd($bid, $seq)) {
				// 해당 게시물 정보를 조회수 증가전에 가져왔기 때문에 조회수를 +1 해줘야됨.
				$result->b_count = $result->b_count + 1; 
				
				$is_hit = true;
			}
			
			// attach 정보가 존재하는지 확인
			$attach = new stdClass;
			$attach->is = false;
			
			$attach->list = $this->dao->getAttach($dto)->list;
			if(!Common::isNullOrEmpty($attach->list)) {
				$attach->is = true;
			}
			
			$this->tpl->define(array("body"=>"../skin/".$boardinfo->ba_skin."/view.html"));
			$this->tpl->assign(array(
					"result"=>$result
					,"binfo"=>$boardinfo
					,'attach'=>$attach
					,'is_hit'=>$is_hit
			));
		} else {
			Javascript::getAlert("존재하지 않는 게시물입니다.");
		}
	}
	
	
	private function doHitAdd($bid, $bseq) {
		$cookie_name = 'sagapo_read';
		$cookie_value = $bid.'_'.$bseq.',';
		
		
		// 쿠키에 해당 게시판을 본 정보가 있는지 확인
		if(Common::getCookieInStr($cookie_name, $cookie_value) === false) {
			// update 로직 실행
			$dto = new DTO();
			$eb = new BoardEB();
			$eb->b_seq = $bseq;
			
			$dto->eb = $eb;	
		
			if($this->dao->doHitAdd($dto)->rc > 0) {
				Common::setCookie($cookie_name, $cookie_value);
				return true;
			} else {
				return false;
			}
		
		} else {
			return false;
		}
		
	} 
	
	function add($bid) {
		
		$boardinfo = $this->getBoardInfo($bid);
		
		$this->page->class = 'board_add';
		$this->page->title = '게시물 추가';
			
		$dto = new DTO();
		$eb = new BoardEB();
		$eb->ba_seq = $boardinfo->ba_seq;
		
		$category = null;
		// 카테고리 정보 가져오기
		if(!Common::isNullOrEmpty($boardinfo->ba_category)) {
			$dto->eb = $eb;
			
			$category = $this->dao->category($dto)->list;
		}
		
		
		$script = Javascript::getjQueryValidateFile();
		array_push($script, 'tiny_mce/jquery.tinymce.js');
		
		if(!Common::isNullOrEmpty($boardinfo->ba_attach)) {
			// 파일 업로드용 js 추가하기
			array_push($script, 'plupload.full.js', 'jquery.plupload.queue.js');
		}
		
		$this->tpl->define(array("body"=>"../skin/".$boardinfo->ba_skin."/add.html"));
		$this->tpl->assign(array(
					 "binfo"=>$boardinfo
					,"script"=>$script
					,"category"=>$category
		));
	}
	
	
	function doAdd() {
		global $firephp;
		$param = new Parameter(false);
		$module = $this->module;
		
		$bid = $param->getParameter($module."_bid");
		
		$boardinfo = $this->getBoardInfo($bid);
			
		$validate = new Validate();
		$validate->add("required", $bid, "게시판 아이디");
		$validate->add("required", $param->getParameter($module."_subject"), "제목");
		$validate->add("required", $param->getParameter($module."_content"), "내용");
		
		// 카테고리 기능을 사용할 경우 입력폼에서 카테고리 시퀀스 값을 가져옴.
		if($boardinfo->ba_category) {
			$validate->add(array("required", "number"), $param->getParameter($module."_category"), "카테고리");
		}
		
		if($validate->validate()) {
			$dto = new DTO();
			
			$eb = new BoardEB();
			$eb->m_id = $_SESSION["owner"]->m_id;
			$eb->m_name = $_SESSION["owner"]->m_name;  
			$eb->ba_seq = $boardinfo->ba_seq;
			$eb->ba_id = $bid;
			$eb->b_subject = $param->getParameter($module."_subject");
			$eb->b_content = $param->getParameter($module."_content");
			$eb->b_notice = $param->getParameter($module."_notice", 0);
			$eb->bc_seq = $param->getParameter($module."_category", null);
			$eb->b_ip = $_SERVER["REMOTE_ADDR"];
			
			
			$dto->eb = $eb;
			
			
			// 카테고리 기능을 사용하지 않을 경우 DB에서 일반 카테고리 시퀀스 값을 가져와서 재 셋팅 해줘야됨
			if(!$boardinfo->ba_category) {
				$dto->eb->bc_seq = $this->dao->getGeneralCategorySeq($dto)->obj;
			}
			
			$insert_num = $this->dao->doAdd($dto)->rc;
			if($insert_num > 0) {
				global $CFG;
				
				// 첨부파일이 전달된게 존재한다면..
				$files = $param->getParameter($module."_files");
				if(!Common::isNullOrEmpty($files)) {
					// temp에 등록된 첨부파일 해당 게시판 업로드 폴더로 이동시키기.
					require_once $CFG->FW_DIR."/utility/Dir.php";
						
					$dir = new Dir();
						
					// 임시 저장소
					$temp_directory = $CFG->DATA_DIR."/upload/temp";
						
					// base directory
					$base_directory = $CFG->DATA_DIR.DIRECTORY_SEPARATOR.'upload'.DIRECTORY_SEPARATOR.'board'.DIRECTORY_SEPARATOR.$bid;
					// 해당 게시판 디렉토리가 존재하지 않으면 생성하기.
					$dir->mkdir($base_directory);
						
					
					$dto = new DTO();
					$feb = new FileEB();
					$feb->seq = $files;
					$dto->eb = $feb;
					$attach_list = $this->dao->getTempAttach($dto)->list;
						
					foreach($attach_list as $al) {
						$temp_file = $temp_directory.DIRECTORY_SEPARATOR.$al->a_savefilename;
						if(file_exists($temp_file)) {
							$move_file = $base_directory.DIRECTORY_SEPARATOR.$al->a_savefilename;
								
							rename($temp_file, $move_file);
								
							// DB도 변경 해야됨..
							$feb = new FileEB();
							$feb->a_path = $base_directory;
							$feb->a_key = $insert_num;
							$feb->a_table = 'board';
							$feb->a_seq = $al->a_seq;
							$feb->a_comple = 1;
								
							$dto->eb = $feb;
								
							$this->dao->doFileMove($dto);
						}
					}
				}
				
				
				$message = "정상적으로 추가 되었습니다.";
				$return_url = $CFG->PATH->WWW."/".$this->module.'/bbs/'.$bid;
				
				if(Common::isAjax()) {
					Javascript::printJSON(array('code'=>Javascript::getSuccessCode(), 'msg'=>$message, 'return_url'=>$return_url));
				} else {
					Javascript::getAlertMove($message, $return_url);
				}
			} else {
				Javascript::getAlertWithAjax("추가시 문제가 발생하였습니다.");
			}
		} else {
			Javascript::getAlertWithAjax($validate->getErrorMessage());
		}
	}
	
	
	
	function modify($bid, $seq) {
		global $firephp;

		$boardinfo = $this->getBoardInfo($bid);
		
		$dto = new DTO();
		$eb = new BoardEB();
		
		$eb->ba_id = $bid;
		$eb->b_seq = $seq;
		$eb->ba_seq = $boardinfo->ba_seq;
		$dto->eb = $eb;
		
		$category = null;
		// 카테고리 정보 가져오기
		if(!Common::isNullOrEmpty($boardinfo->ba_category)) {	
			$category = $this->dao->category($dto)->list;
		}
		
		
		$result = $this->dao->view($dto)->obj;
		
		
		$this->page->class = 'board_add';
		$this->page->title = $result->b_subject.' 게시물 수정';
		
		if(!Common::isNullOrEmpty($result)) {
			$script = array('tiny_mce/jquery.tinymce.js');
			
			if(!Common::isNullOrEmpty($boardinfo->ba_attach)) {
				// 파일 업로드용 js 추가하기
				array_push($script, 'plupload.full.js', 'jquery.plupload.queue.js');
			}
			
			// 첨부파일
			// attach 정보가 존재하는지 확인
			$attach = new stdClass;
			$attach->is = false;
				
			$attach->list = $this->dao->getAttach($dto)->list;
			if(!Common::isNullOrEmpty($attach->list)) {
				$attach->is = true;
			}
			
			$this->tpl->define(array("body"=>"../skin/".$boardinfo->ba_skin."/modify.html"));
			$this->tpl->assign(array(
						 "binfo"=>$boardinfo
						,"script"=>$script
						,"category"=>$category
						,"result"=>$result
						,'attach'=>$attach
			));	
			
		} else {
			Javascript::getAlert("존재하지 않는 게시물 입니다.");
		}
		
	}
	
	
	
	function doModify() {
		
		$param = new Parameter(false);
		$module = $this->module;
		
		$bid = $param->getParameter($module."_bid");
		
		$board_seq = $param->getParameter($module."_seq");
		$boardinfo = $this->getBoardInfo($bid);
			
		$validate = new Validate();
		$validate->add("required", $bid, "게시판 아이디");
		$validate->add(array("required", "number"), $board_seq, "게시물번호");
		$validate->add("required", $param->getParameter($module."_subject"), "제목");
		$validate->add("required", $param->getParameter($module."_content"), "내용");
		
		// 카테고리 기능을 사용할 경우 입력폼에서 카테고리 시퀀스 값을 가져옴.
		if(!Common::isNullOrEmpty($boardinfo->ba_category)) {
			$validate->add(array("required", "number"), $param->getParameter($module."_category"), "카테고리");
		}
		
		if($validate->validate()) {
			$dto = new DTO();
			
			$eb = new BoardEB();  
			$eb->b_seq = $board_seq;
			$eb->ba_id = $param->getParameter($module."_bid");
			$eb->b_subject = $param->getParameter($module."_subject");
			$eb->b_content = $param->getParameter($module."_content");
			
			
			if(!Common::isNullOrEmpty($boardinfo->ba_category)) {
				$eb->bc_seq = $param->getParameter($module."_category", null);
				$eb->bc_oseq = $param->getParameter($module."_ocategory", null);	
			}
			$dto->eb = $eb;
			
			
			
			$result = $this->dao->doModify($dto)->rc;
			
			global $CFG;
			
			// 임시 저장소
			$temp_directory = $CFG->DATA_DIR."/upload/temp";
		
			// base directory
			$base_directory = $CFG->DATA_DIR.DIRECTORY_SEPARATOR.'upload'.DIRECTORY_SEPARATOR.'board'.DIRECTORY_SEPARATOR.$bid;
			
			// 삭제하려는 파일
			if(!Common::isNullOrEmpty($param->getParameter($module.'_remove_files'))) {
				$remove_file = join(',', $param->getParameter($module.'_remove_files'));
				$dto = new DTO();
				$feb = new FileEB();
				$feb->seq = $remove_file;
				$dto->eb = $feb;
				
				// 삭제될 첨부파일 정보 가져오기.
				$attach_list = $this->dao->getTempAttach($dto)->list;
				if(!Common::isNullOrEmpty($attach_list)) {
					foreach($attach_list as $al) {
						$remove_filename = $base_directory.DIRECTORY_SEPARATOR.$al->a_savefilename;
						if(file_exists($temp_file)) {
							// 첨부파일 삭제
							unlink($remove_filename);
						}
					}
					
					// DB 한꺼번에 삭제
					$this->dao->doAttachDelete($dto);
				}
			}
			// 첨부파일이 전달된게 존재한다면..
			$files = $param->getParameter($module."_files");
			if(!Common::isNullOrEmpty($files)) {
				// temp에 등록된 첨부파일 해당 게시판 업로드 폴더로 이동시키기.
				require_once $CFG->FW_DIR."/utility/Dir.php";
				$dir = new Dir();
			
				// 해당 게시판 디렉토리가 존재하지 않으면 생성하기.
				$dir->mkdir($base_directory);
					
				$dto = new DTO();
				$feb = new FileEB();
				$feb->seq = $files;
				$dto->eb = $feb;
				$attach_list = $this->dao->getTempAttach($dto)->list;
			
				foreach($attach_list as $al) {
					$temp_file = $temp_directory.DIRECTORY_SEPARATOR.$al->a_savefilename;
					if(file_exists($temp_file)) {
						$move_file = $base_directory.DIRECTORY_SEPARATOR.$al->a_savefilename;
			
						rename($temp_file, $move_file);
			
						// DB도 변경 해야됨..
						$feb = new FileEB();
						$feb->a_path = $base_directory;
						$feb->a_key = $board_seq;
						$feb->a_table = 'board';
						$feb->a_seq = $al->a_seq;
						$feb->a_comple = 1;
			
						$dto->eb = $feb;
			
						$this->dao->doFileMove($dto);
					}
				}
			}
			
			$message = "정상적으로 수정 되었습니다.";
			$return_url = $CFG->PATH->WWW."/".$this->module.'/view/'.$bid.'/'.$board_seq;
			
			if(Common::isAjax()) {
				Javascript::printJSON(array('code'=>Javascript::getSuccessCode(), 'msg'=>$message, 'return_url'=>$return_url));
			} else {
				Javascript::getAlertMove($message, $return_url);
			}
		} else {
			Javascript::getAlert($validate->getErrorMessage());
		}
	}
	
	
	function doDelete($bid, $seq) {
		$boardinfo = $this->getBoardInfo($bid);
		
		
		
		$dto = new DTO();
		$eb = new BoardEB();
		
		$eb->ba_id = $bid;
		$eb->b_seq = $seq;
		$dto->eb = $eb;
		
		// 해당 게시물이 존재하는지 확인
		// 카테고리 key값도 가져와야됨 ㅠ
		$result = $this->dao->view($dto)->obj;
		if(!Common::isNullOrEmpty($result)) {
			
			// 카테고리 번호 셋팅 (board_admin->bc_count 값을 변경 해줘야됨.)
			$dto->eb->bc_seq = $result->bc_seq;
			
			
			$result = $this->dao->doDelete($dto)->rc;
			if($result > 0) {
				global $CFG;
					
				Javascript::getAlertMove("삭제 되었습니다.", "/".$this->module."/bbs/".$eb->ba_id);
			} else {
				Javascript::getAlert("삭제시 문제가 발생하였습니다.");
			}	
		} else {
			Javascript::getAlert("존재하지 않는 게시물 입니다.");	
		}
	}


}

